package com.fxd.uitls;


import java.sql.Connection;

import javax.sql.DataSource;

/**
 * @auther fuxudong
 * @date 2021/1/24 - 11:09
 * 连接的工具类，它用于从数据源中获取一个连接，并且实现和线程的绑定
 */
public class connectionUtil {
    /**
     * ThreadLocal是线程局部变量，所谓的线程局部变量，就是仅仅只能被本线程访问，不能在线程之间进行共享访问的变量。
     * 该ThreadLocal对应的值存在一个成员变量table里，以key/value的形式存储，key是当前的ThreadLocal实例，value就是我们要保存的值
     * threadLocalHashCode到底用来唯一确定一个ThreadLocal对象的
     * 一个线程来说一个ThreadLocal对象作为键只能保存一个值，所以一个线程中也可以新建多个ThreadLocal对象
     */
    private ThreadLocal<java.sql.Connection> t1 = new ThreadLocal<java.sql.Connection>();

    private DataSource dataSource;

    public void setDataSource(DataSource dataSource) {
        this.dataSource = dataSource;
    }

    //获取当前线程上的连接
    public Connection getThreadConnection() {
        try {
            //1,先从threadlocal上获取
            java.sql.Connection conn = t1.get();
            //2,判断线程上是否有连接
            if (conn == null) {
                //3，从数据源中获取一个连接，并且存入threadlocal中
                conn = dataSource.getConnection();
                t1.set(conn);
            }
            return conn;
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    //让threadlocal对象与线程解绑
    public void removeconn() {
        t1.remove();
    }
}
